package com.wpw.dream.dubbo.rest.service;

import javax.servlet.http.HttpServletRequest;
import javax.ws.rs.Consumes;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;

import com.wpw.dream.dubbo.rest.entry.User;

@Path("rest")
public interface RestService {
	
	@POST
	@Path("{id:\\d+}")
	@Produces(MediaType.APPLICATION_JSON)
	public Object param(@PathParam("id")Long id);

	@POST
	@Path("json/{id:\\d+}")
	@Produces(MediaType.APPLICATION_JSON)
	public Object returnJson(@PathParam("id")Long id);

	@POST
	@Path("xml/{id:\\d+}")
	@Consumes(MediaType.APPLICATION_JSON)
	@Produces(MediaType.APPLICATION_XML)
	public User returnXml(@PathParam("id")Long id);

	@POST
	@Path("paramJson")
	@Consumes(MediaType.APPLICATION_JSON)
	@Produces(MediaType.APPLICATION_XML)
	public Object paramJson(User user);
	
	@POST
	@Path("paramXml")
	@Consumes(MediaType.APPLICATION_XML)
	@Produces(MediaType.APPLICATION_JSON)
	public Object paramXml(User user);
	
	/**
	 * 注意：这种方式只能在设置server="tjws"或者server="tomcat"或者server="jetty"或者server="servlet"的时候才能工作，
	 * 因为只有这几种REST server的实现才提供了servlet容器。
	 * 另外，标准的JAX-RS还支持用@Context修饰service类的一个实例字段来获取HttpServletRequest，但在dubbo中我们没有对此作出支持。
	 */
	@POST
	@Path("getConntext")
	@Consumes(MediaType.APPLICATION_XML)
	@Produces(MediaType.TEXT_PLAIN)
	public Object getConntext(@Context HttpServletRequest request);
	
	/**
	 * 注意：这种方式只能在设置server="jetty"或者server="tomcat"或者server="servlet"或者server="tjws"的时候才能工作。另外，目前dubbo的RpcContext是一种比较有侵入性的用法，未来我们很可能会做出重构。
	 */
	@POST
	@Path("getRpcConntext")
	@Consumes(MediaType.APPLICATION_XML)
	@Produces(MediaType.TEXT_PLAIN)
	public Object getRpcConntext();
}
